#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e5 + 5;

// 前向星结构定义
// 前向星的实现本质上就是链表头插法的一种具体应用
struct Edge {
  int to, w, nxt; // to: 边的终点, w: 边权重, nxt: 下一条邻接边的索引
} e[MAXN << 1];   // 边数组，大小通常是最大边数的两倍(无向图)

int head[MAXN], cnt; // head数组记录每个节点的第一条边，cnt是边计数器

// 添加边的函数
void add(int u, int v, int w) {
  e[++cnt] = (Edge){v, w, head[u]};
  // 新建边，指向原来head[u]指向的边
  head[u] = cnt;
  // 更新u节点的头边为新添加的边
}

int x[MAXN];
long long ans = 0;
int sm[MAXN];

void dfs(int v, int fa = 0) {
  sm[v] = x[v];                            // 初始化当前节点的值为x[v]
  for (int i = head[v]; i; i = e[i].nxt) { // 遍历所有邻接边i
    if (e[i].to == fa)                     // 跳过父节点避免循环
      continue;
    dfs(e[i].to, v);               // 递归处理子节点
    int c = std::abs(sm[e[i].to]); // 计算子节点剩余点的绝对值
    ans += 1ll * c * e[i].w;       // 累加当前边的贡献到总答案
    sm[v] += sm[e[i].to];          // 将子节点的值累加到当前节点
  }
}

int main() {
  int n;
  scanf("%d", &n); // 读取节点数量
  for (int i = 1; i <= n; ++i)
    scanf("%d", x + i);          // 读取每个节点的初始值
  for (int i = 2; i <= n; ++i) { // 读取n-1条边
    int u, v, w;
    scanf("%d%d%d", &u, &v, &w); // 读取边的两端点和权重
    add(u, v, w);                // 添加无向边
    add(v, u, w);
  }
  dfs(1);                // 从根节点1开始DFS遍历
  printf("%lld\n", ans); // 输出最终结果
  return 0;
}